diff -ru herrie-autoplay/herrie-2.0.2/src/config.c herrie-autoquit/herrie-2.0.2/src/config.c
--- herrie-autoplay/herrie-2.0.2/src/config.c	2008-05-16 20:49:55.000000000 -0500
+++ herrie-autoquit/herrie-2.0.2/src/config.c	2008-05-16 02:31:56.000000000 -0500
@@ -163,6 +163,7 @@
 	{ "gui.input.may_quit",		"yes",		valid_bool,	NULL },
 	{ "gui.vfslist.scrollpages",	"no",		valid_bool,	NULL },
 	{ "playq.autoplay",		"no",		valid_bool,	NULL },
+	{ "playq.autoquit",		"no",		valid_bool,	NULL },
 	{ "playq.dumpfile",		CONFHOMEDIR PLAYQ_DUMPFILE, NULL, NULL },
 	{ "playq.xmms",			"no",		valid_bool,	NULL },
 #ifdef BUILD_SCROBBLER
diff -ru herrie-autoplay/herrie-2.0.2/src/main.c herrie-autoquit/herrie-2.0.2/src/main.c
--- herrie-autoplay/herrie-2.0.2/src/main.c	2008-05-16 20:49:55.000000000 -0500
+++ herrie-autoquit/herrie-2.0.2/src/main.c	2008-05-16 02:33:37.000000000 -0500
@@ -99,7 +99,7 @@
 static void
 usage(void)
 {
-	g_printerr("%s: " APP_NAME " [-pvx] [-c configfile] "
+	g_printerr("%s: " APP_NAME " [-pqvx] [-c configfile] "
 	    "[file ...]\n", _("usage"));
 	exit(1);
 }
@@ -110,7 +110,7 @@
 int
 main(int argc, char *argv[])
 {
-	int ch, i, show_version = 0, autoplay = 0, xmms = 0;
+	int ch, i, show_version = 0, autoplay = 0, autoquit = 0, xmms = 0;
 	char *cwd;
 	const char *errmsg;
 	struct vfsref *vr;
@@ -128,7 +128,7 @@
 	config_load(CONFFILE, 1);
 	config_load(CONFHOMEDIR "config", 1);
 
-	while ((ch = getopt(argc, argv, "c:pvx")) != -1) {
+	while ((ch = getopt(argc, argv, "c:pqvx")) != -1) {
 		switch (ch) {
 		case 'c':
 			config_load(optarg, 0);
@@ -136,6 +136,9 @@
 		case 'p':
 			autoplay = 1;
 			break;
+		case 'q':
+			autoquit = 1;
+			break;
 		case 'v':
 			show_version = 1;
 			break;
@@ -173,7 +176,7 @@
 #ifdef BUILD_SCROBBLER
 	scrobbler_init();
 #endif /* BUILD_SCROBBLER */
-	playq_init(autoplay, xmms, (argc == 0));
+	playq_init(autoplay, autoquit, xmms, (argc == 0));
 
 	/* Draw all the windows */
 	gui_draw_init_post();
diff -ru herrie-autoplay/herrie-2.0.2/src/playq.c herrie-autoquit/herrie-2.0.2/src/playq.c
--- herrie-autoplay/herrie-2.0.2/src/playq.c	2008-05-16 20:49:55.000000000 -0500
+++ herrie-autoquit/herrie-2.0.2/src/playq.c	2008-05-25 00:25:02.000000000 -0500
@@ -151,6 +151,11 @@
 static volatile int	playq_seek_time;
 
 /**
+ * @brief If true, quit when end of list reached
+ */
+int			playq_autoquit = 0;
+
+/**
  * @brief Infinitely play music in the playlist, honouring the
  *        playq_flags.
  */
@@ -163,6 +168,8 @@
 
 	gui_input_sigmask();
 
+	/* Used to prevent autoquit occuring at startup when autoplay is enabled on an empty list */
+	int playq_autoquit_ready = 0;
 	do {
 		/* Wait until there's a song available */
 		playq_lock();
@@ -174,10 +181,20 @@
 			}
 
 			/* Try to start a new song when we're not stopped */
-			if (!(playq_flags & PF_STOP) &&
-			    (nvr = funcs->give()) != NULL) {
+			if (!(playq_flags & PF_STOP)) {
+			    if ((nvr = funcs->give()) != NULL) {
 				/* We've got work to do */
 				break;
+			    }
+			    else {
+				if (playq_autoquit_ready && playq_autoquit) {
+					/* Time to quit - Send ourself the SIGTERM */
+					int res = getpid();
+  					if (res !=0){
+    						kill(res,SIGTERM);
+  					}
+			        }
+			    }
 			}
 
 			/* Wait for new events to occur */
@@ -188,6 +205,9 @@
 		}
 		playq_unlock();
 
+		/* Safe to autoquit now */
+		playq_autoquit_ready = 1;
+
 		cur = audio_file_open(nvr);
 		if (cur == NULL) {
 			/* Skip broken songs */
@@ -242,7 +262,7 @@
 }
 
 void
-playq_init(int autoplay, int xmms, int load_dumpfile)
+playq_init(int autoplay, int autoquit, int xmms, int load_dumpfile)
 {
 	const char *filename;
 	struct vfsref *vr;
@@ -259,6 +279,9 @@
 		playq_repeat = 1;
 	}
 
+	if (autoquit || config_getopt_bool("playq.autoquit"))
+		playq_autoquit = 1;
+
 	filename = config_getopt("playq.dumpfile");
 	if (load_dumpfile && filename[0] != '\0') {
 		/* Autoload playlist */
diff -ru herrie-autoplay/herrie-2.0.2/src/playq.h herrie-autoquit/herrie-2.0.2/src/playq.h
--- herrie-autoplay/herrie-2.0.2/src/playq.h	2008-05-16 20:49:55.000000000 -0500
+++ herrie-autoquit/herrie-2.0.2/src/playq.h	2008-05-16 02:38:12.000000000 -0500
@@ -33,7 +33,7 @@
 /**
  * @brief Initialize the playlist locking.
  */
-void playq_init(int autoplay, int xmms, int load_dumpfile);
+void playq_init(int autoplay, int autoquit, int xmms, int load_dumpfile);
 /**
  * @brief Spawn the playback thread.
  */
diff -ru herrie-autoplay/herrie-2.0.2/src/playq_modules.h herrie-autoquit/herrie-2.0.2/src/playq_modules.h
--- herrie-autoplay/herrie-2.0.2/src/playq_modules.h	2008-04-23 14:29:24.000000000 -0500
+++ herrie-autoquit/herrie-2.0.2/src/playq_modules.h	2008-05-16 03:01:29.000000000 -0500
@@ -36,6 +36,11 @@
 extern int playq_repeat;
 
 /**
+ * @brief Flag whether autoquit is turned on by the user.
+ */
+extern int playq_autoquit;
+
+/**
  * @brief Herrie's routine to fetch the next song from the playlist
  *        (always the first song).
  */
diff -ru herrie-autoplay/herrie-2.0.2/src/playq_party.c herrie-autoquit/herrie-2.0.2/src/playq_party.c
--- herrie-autoplay/herrie-2.0.2/src/playq_party.c	2008-04-23 14:29:24.000000000 -0500
+++ herrie-autoquit/herrie-2.0.2/src/playq_party.c	2008-05-16 03:57:41.000000000 -0500
@@ -49,7 +49,7 @@
 	nvr = vfs_dup(vr);
 	gui_playq_notify_pre_removal(1);
 	vfs_list_remove(&playq_list, vr);
-	if (playq_repeat) {
+	if (playq_repeat && !playq_autoquit) {
 		/* Add it back to the tail */
 		vfs_list_insert_tail(&playq_list, vr);
 		gui_playq_notify_post_insertion(vfs_list_items(&playq_list));
diff -ru herrie-autoplay/herrie-2.0.2/src/playq_xmms.c herrie-autoquit/herrie-2.0.2/src/playq_xmms.c
--- herrie-autoplay/herrie-2.0.2/src/playq_xmms.c	2008-05-16 20:49:55.000000000 -0500
+++ herrie-autoquit/herrie-2.0.2/src/playq_xmms.c	2008-05-16 02:50:17.000000000 -0500
@@ -61,7 +61,7 @@
 		/* Song after current song */
 		cursong = vfs_list_next(cursong);
 		/* We've reached the end */
-		if (cursong == NULL && playq_repeat)
+		if (cursong == NULL && playq_repeat && !playq_autoquit)
 			cursong = vfs_list_first(&playq_list);
 	} else {
 		cursong = vfs_list_first(&playq_list);
